package Entity;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 直播信息表实体类（对应livestream表）
 * 兼容MySQL 5.7+，移除CHECK约束，非负约束由业务层保证
 */
@Data
public class Livestream {
    // 直播ID（自增主键，非空）
    private Integer streamId;
    // 主播ID（非空）
    private Integer hostId;
    // 直播标题（非空，最大255字符）
    private String title;
    // 开始时间（非空，DATETIME类型）
    private Date startTime;
    // 结束时间（可空，直播未结束/未开始时为null）
    private Date endTime;
    // 直播状态（ENUM枚举：live-直播中，ended-已结束，offline-未开始，默认offline）
    private LiveStatus status;
    // 实时观众数（非负，UNSIGNED，默认0）
    private Integer viewers;
    // 平均观看时长（分钟，非负，UNSIGNED，可空）
    private Integer avgViewDuration;
    // 总销售额（非负，UNSIGNED，精度12位整数+2位小数，默认0.00）
    private BigDecimal totalSales;
    // 订单总数（非负，UNSIGNED，默认0）
    private Integer orderCount;

    // 关联商品ID（复合主键之一，非空，外键关联product.product_id）
    private Integer productId;
    // 商品曝光次数（非负，UNSIGNED，默认0）
    private Integer exposureCount;
    // 商品点击次数（非负，UNSIGNED，默认0，不超过曝光次数）
    private Integer clickCount;
    // 本场销量（非负，UNSIGNED，默认0）
    private Integer salesVolume;
    // 点击率（自动计算：IF(exposure_count=0, 0, click_count/exposure_count)，DECIMAL(6,4)）
    private BigDecimal clickRate;

    // -------------------------- 枚举类：适配MySQL的status ENUM类型 --------------------------
    public enum LiveStatus {
        live,    // 直播中
        ended,   // 已结束
        offline  // 未开始（默认值）
    }

    // -------------------------- 标准POJO规范：无参构造（必需，Flink反射解析用） --------------------------
    public Livestream() {}

    // -------------------------- Getter/Setter（必需，Flink赋值/取值用） --------------------------
    public Integer getStreamId() {
        return streamId;
    }

    public void setStreamId(Integer streamId) {
        this.streamId = streamId;
    }

    public Integer getHostId() {
        return hostId;
    }

    public void setHostId(Integer hostId) {
        this.hostId = hostId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Date getStartTime() {
        return startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    public LiveStatus getStatus() {
        return status;
    }

    public void setStatus(LiveStatus status) {
        this.status = status;
    }

    // 兼容JSON字符串解析（若JSON中status是字符串，可通过此方法转换为枚举）
    public void setStatus(String status) {
        this.status = LiveStatus.valueOf(status);
    }

    public Integer getViewers() {
        return viewers;
    }

    public void setViewers(Integer viewers) {
        // 业务层保证非负（适配UNSIGNED）
        if (viewers != null && viewers < 0) {
            throw new IllegalArgumentException("viewers（实时观众数）不能为负数");
        }
        this.viewers = viewers;
    }

    public Integer getAvgViewDuration() {
        return avgViewDuration;
    }

    public void setAvgViewDuration(Integer avgViewDuration) {
        // 业务层保证非负（适配UNSIGNED）
        if (avgViewDuration != null && avgViewDuration < 0) {
            throw new IllegalArgumentException("avgViewDuration（平均观看时长）不能为负数");
        }
        this.avgViewDuration = avgViewDuration;
    }

    public BigDecimal getTotalSales() {
        return totalSales;
    }

    public void setTotalSales(BigDecimal totalSales) {
        // 业务层保证非负（适配UNSIGNED），并强制2位小数（匹配DECIMAL(12,2)）
        if (totalSales != null) {
            if (totalSales.compareTo(BigDecimal.ZERO) < 0) {
                throw new IllegalArgumentException("totalSales（总销售额）不能为负数");
            }
            this.totalSales = totalSales.setScale(2, BigDecimal.ROUND_HALF_UP);
        } else {
            this.totalSales = BigDecimal.ZERO.setScale(2); // 默认0.00
        }
    }

    public Integer getOrderCount() {
        return orderCount;
    }

    public void setOrderCount(Integer orderCount) {
        // 业务层保证非负（适配UNSIGNED）
        if (orderCount != null && orderCount < 0) {
            throw new IllegalArgumentException("orderCount（订单总数）不能为负数");
        }
        this.orderCount = orderCount;
    }




    // -------------------------- toString（可选，调试时打印数据用） --------------------------
    @Override
    public String toString() {
        return "Livestream{" +
                "streamId=" + streamId +
                ", hostId=" + hostId +
                ", title='" + title + '\'' +
                ", startTime=" + startTime +
                ", endTime=" + endTime +
                ", status=" + status +
                ", viewers=" + viewers +
                ", avgViewDuration=" + avgViewDuration +
                ", totalSales=" + totalSales +
                ", orderCount=" + orderCount +
                '}';
    }
}